package com.cool.collect.springcode.a14;

import org.springframework.cglib.core.Signature;

/**
 * @author xiemiao
 * @description
 * @date 2023/09/05
 */
public class TargetFastClass {

    static Signature s0 = new Signature("save", "()V");
    static Signature s1 = new Signature("save", "(I)V");
    static Signature s2 = new Signature("save", "(J)V");

    /**
     * 获取目标方法的编号
     * Target method
     * save()     0
     * save(int)  1
     * save(long) 2
     *
     * @param signature 包括方法的名字，参数，返回值
     * @return
     */
    public int getIndex(Signature signature) {
        if (s0.equals(signature)) {
            return 0;
        } else if (s1.equals(signature)) {
            return 1;
        } else if (s2.equals(signature)) {
            return 2;
        } else {
            return -1;
        }
    }

    /**
     * 根据方法编号，正常调用目标对象方法
     *
     * @param index  编号
     * @param target 目标对象
     * @param args   执行的参数数组
     * @return
     */
    public Object invoke(int index, Object target, Object[] args) {
        if (index == 0) {
            ((Target) target).save();
            return null;
        } else if (index == 1) {
            ((Target) target).save((int) args[0]);
            return null;
        } else if (index == 2) {
            ((Target) target).save((long) args[0]);
            return null;
        } else {
            throw new RuntimeException("无此方法");
        }
    }
}
